// 泛型构造函数（Generic Constructor）是指使用模板技术实现的构造函数，
// 它允许一个类接受不同类型的参数来初始化对象。在C++中，这通常通过模板参数来实现。

// 泛型构造函数的基本形式
class MyClass
{
public:
    // 泛型构造函数
    template <typename T>
    MyClass(T value)
    {
        // 使用value初始化对象
    }
};

// 泛型构造函数的特点
// 1.灵活性：可以接受多种不同类型的参数
// 2.类型安全：在编译时进行类型检查
// 3.代码复用：避免为不同类型编写多个构造函数
// 4.隐式类型转换：可能导致意外的隐式转换，需要小心使用

// 实际应用示例
// 1. 容器类的构造函数
template <typename T>
class Container
{
private:
    T *data;
    size_t size;

public:
    // 泛型构造函数，接受任何可迭代对象
    template <typename Iterator>
    Container(Iterator begin, Iterator end)
        : size(std::distance(begin, end)), data(new T[size])
    {
        std::copy(begin, end, data);
    }
};

// 2. 完美转发构造函数
template <typename T>
class Wrapper
{
private:
    T value;

public:
    // 泛型构造函数，使用完美转发
    template <typename... Args>
    Wrapper(Args &&...args) : value(std::forward<Args>(args)...)
    {
        // 将参数完美转发给T的构造函数
    }
};

// 3. 使用enable_if约束泛型构造函数
class Number
{
private:
    double value;

public:
    // 只接受数值类型的泛型构造函数
    template <typename T,
              typename = typename std::enable_if<std::is_arithmetic<T>::value>::type>
    Number(T val) : value(static_cast<double>(val))
    {
        std::cout << "Numeric constructor called\n";
    }

    // 字符串构造函数
    Number(const std::string &str) : value(std::stod(str))
    {
        std::cout << "String constructor called\n";
    }
};